﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractFactory
{
    /// <summary>
    /// 抽象工厂模式（Abstract Factory Pattern）是一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
    /// 这种类型的设计模式属于创建型模式，它提供了一种创建对象的最佳方式。工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,
    /// 简单工厂模式的工厂随着产品类的增加需要增加额外的代码，而工厂方法模式每个具体工厂类只完成单个实例的创建,它具有很好的可扩展性。
    /// 但是在现实生活中，一个工厂只创建单个产品比较少，工厂都多元化，一个工厂创建一系列的产品，如果我们要设计这样的系统时，工厂方法模式就不太适用，
    /// 而使用抽象工厂模式却可以很好地解决。

    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();

            xiaoMiFactory.CreatePhone().TurnOn();
            xiaoMiFactory.CreateTV().TrunOn();


            var huaweifatory = new XiaoMiFactory();
            var huaweiPhone = huaweifatory.CreatePhone();
            huaweiPhone.TurnOn();
            var huaweiTV = huaweifatory.CreateTV();
            huaweiTV.TrunOn();

        }
    }

    public interface IPhone
    {
        void TurnOn();
    }

    public class XiaoMiPhone : IPhone
    {
        public void TurnOn()
        {
            Console.WriteLine("小米开机Logo");
        }
    }

    public class HuaWeiPhone : IPhone
    {
        public void TurnOn()
        {
            Console.WriteLine("华为开机Logo");
        }
    }

    public interface ITV
    {
        void TrunOn();
    }

    public class XiaoMiTV : ITV
    {
        public void TrunOn()
        {
            Console.WriteLine("XiaoMiTV");
        }
    }

    public class HuaWiTV : ITV
    {
        public void TrunOn()
        {
            Console.WriteLine("HuaWiTV");
        }
    }

    public interface IFactory
    {
        IPhone CreatePhone();

        ITV CreateTV();
    }

    public class XiaoMiFactory : IFactory
    {
        public IPhone CreatePhone()
        {
            return new XiaoMiPhone();
        }

        public ITV CreateTV()
        {
            return new XiaoMiTV();
        }
    }


    public class HuaWeiFactory : IFactory
    {
        public IPhone CreatePhone()
        {
            return new HuaWeiPhone();
        }

        public ITV CreateTV()
        {
            return new HuaWiTV();
        }
    }


}
